#include <vector>
using namespace std;
// 螺旋遍历（顺时针）：使用开区间边界 [left, right) 和 [top, bottom)
// 关键点：每次收缩边界后立刻检查是否为空区间，避免重复/越界
class Solution
{
public:
    vector<int> spiralOrder(vector<vector<int>> &matrix)
    {
        vector<int> res;
        int m = matrix.size();
        if (m == 0)
            return res;
        int n = matrix[0].size();
        if (n == 0)
            return res;

        int left = 0, right = n; // 列的开区间 [left, right)
        int top = 0, bottom = m; // 行的开区间 [top, bottom)

        while (left < right && top < bottom)
        {
            // 1) top 行：从左到右，列 i=[left, right)
            for (int i = left; i < right; ++i)
            {
                res.push_back(matrix[top][i]);
            }
            ++top;
            if (top >= bottom)
                break; // 只剩 0 行，停止

            // 2) right-1 列：从上到下，行 i=[top, bottom)
            for (int i = top; i < bottom; ++i)
            {
                res.push_back(matrix[i][right - 1]);
            }
            --right;
            if (left >= right)
                break; // 只剩 0 列，停止

            // 3) bottom-1 行：从右到左，列 i=[right-1 ... left]
            for (int i = right - 1; i >= left; --i)
            {
                res.push_back(matrix[bottom - 1][i]);
            }
            --bottom;
            if (top >= bottom)
                break; // 只剩 0 行，停止

            // 4) left 列：从下到上，行 i=[bottom-1 ... top]
            for (int i = bottom - 1; i >= top; --i)
            {
                res.push_back(matrix[i][left]);
            }
            ++left;
            // 下一轮 while 会再统一检查 left<right && top<bottom
        }
        return res;
    }
};
